package com.it.smartoldb.controller;

import com.it.smartoldb.common.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 文件上传控制器
 */
@Tag(name = "文件上传", description = "文件上传相关接口")
@RestController
@RequestMapping("/api/upload")
@Slf4j
public class UploadController {

    // 上传文件保存路径（可以通过配置文件配置）
    @Value("${upload.path:./uploads}")
    private String uploadPath;

    // 访问URL前缀
    @Value("${upload.url-prefix:http://localhost:8080/uploads}")
    private String urlPrefix;

    /**
     * 上传头像
     */
    @Operation(summary = "上传头像", description = "上传用户头像文件")
    @PostMapping("/avatar")
    public Result<Map<String, Object>> uploadAvatar(@RequestParam("file") MultipartFile file) {
        try {
            // 验证文件
            if (file.isEmpty()) {
                return Result.error("文件不能为空");
            }

            // 验证文件类型
            String contentType = file.getContentType();
            if (contentType == null || !contentType.startsWith("image/")) {
                return Result.error("只能上传图片文件");
            }

            // 验证文件大小（2MB）
            if (file.getSize() > 2 * 1024 * 1024) {
                return Result.error("文件大小不能超过2MB");
            }

            // 创建上传目录
            String avatarDir = uploadPath + "/avatars";
            File dir = new File(avatarDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 生成文件名
            String originalFilename = file.getOriginalFilename();
            String extension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }

            // 使用UUID + 时间戳生成唯一文件名
            String fileName = UUID.randomUUID().toString().replace("-", "") + 
                            "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + 
                            extension;

            // 保存文件
            Path filePath = Paths.get(avatarDir, fileName);
            Files.copy(file.getInputStream(), filePath);

            // 生成访问URL
            String fileUrl = urlPrefix + "/avatars/" + fileName;

            // 返回结果
            Map<String, Object> result = new HashMap<>();
            result.put("url", fileUrl);
            result.put("filename", fileName);
            result.put("originalName", originalFilename);
            result.put("size", file.getSize());

            log.info("头像上传成功: {}", fileUrl);
            return Result.success(result);

        } catch (IOException e) {
            log.error("头像上传失败", e);
            return Result.error("文件上传失败: " + e.getMessage());
        }
    }

    /**
     * 上传通用文件
     */
    @Operation(summary = "上传文件", description = "上传通用文件")
    @PostMapping("/file")
    public Result<Map<String, Object>> uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 验证文件
            if (file.isEmpty()) {
                return Result.error("文件不能为空");
            }

            // 验证文件大小（10MB）
            if (file.getSize() > 10 * 1024 * 1024) {
                return Result.error("文件大小不能超过10MB");
            }

            // 创建上传目录
            String fileDir = uploadPath + "/files";
            File dir = new File(fileDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 生成文件名
            String originalFilename = file.getOriginalFilename();
            String extension = "";
            if (originalFilename != null && originalFilename.contains(".")) {
                extension = originalFilename.substring(originalFilename.lastIndexOf("."));
            }

            String fileName = UUID.randomUUID().toString().replace("-", "") + 
                            "_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) + 
                            extension;

            // 保存文件
            Path filePath = Paths.get(fileDir, fileName);
            Files.copy(file.getInputStream(), filePath);

            // 生成访问URL
            String fileUrl = urlPrefix + "/files/" + fileName;

            // 返回结果
            Map<String, Object> result = new HashMap<>();
            result.put("url", fileUrl);
            result.put("filename", fileName);
            result.put("originalName", originalFilename);
            result.put("size", file.getSize());

            log.info("文件上传成功: {}", fileUrl);
            return Result.success(result);

        } catch (IOException e) {
            log.error("文件上传失败", e);
            return Result.error("文件上传失败: " + e.getMessage());
        }
    }
} 